package edu.ynu.MyProject.service;

import edu.ynu.MyProject.common.service.LogicService;
import edu.ynu.MyProject.dao.IUserDAO;
import edu.ynu.MyProject.entity.User;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.subject.Subject;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;

import javax.transaction.Transactional;
import java.util.Optional;

@Service
public class UserService extends LogicService<IUserDAO, User,Long> {

    public UserService(IUserDAO dao) {
        super(dao);
    }

    @Transactional
    public User login(String username, String password) throws AuthenticationException {
        Subject subject = SecurityUtils.getSubject();
        UsernamePasswordToken token = new UsernamePasswordToken(username, password);
        // 调用 Shiro 的登录方法
        subject.login(token);
        // 登录成功后查询用户信息返回
        Optional<User> optionalUser = dao.findByUsername(username);
        if (!optionalUser.isPresent()) {
            throw new AuthenticationException("用户不存在");
        }
        return optionalUser.get();
    }




    /**
     * 创建新用户
     *
     * @param username 用户名
     * @param password 密码
     * @return 新创建的用户
     */
    @Transactional
    public User createUser(String username, String password) {
        // 检查用户名是否已存在
        if (dao.existsByUsername(username)) {
            throw new IllegalArgumentException("用户名已存在");
        }

        // 创建用户对象并设置密码
        User user = new User();
        user.setUsername(username);
        user.setPassword(password);  // 密码自动加密

        // 保存用户
        return dao.save(user);
    }

    /**
     * 修改用户密码
     * @param username 用户名
     * @param oldPassword 旧密码
     * @param newPassword 新密码
     * @throws IllegalArgumentException 如果旧密码不匹配
     */
    @Transactional
    public void updatePassword(String username, String oldPassword, String newPassword) {
        // 查找用户
        User user = dao.findByUsername(username)
                .orElseThrow(() -> new IllegalArgumentException("用户不存在"));

        // 校验旧密码
        if (!user.getPassword().equals(DigestUtils.md5DigestAsHex(oldPassword.getBytes()))) {
            throw new IllegalArgumentException("旧密码不正确");
        }

        // 设置新密码
        user.setPassword(newPassword);  // 密码自动加密
        dao.save(user);  // 保存更新后的用户
    }

    /**
     * 根据用户名获取用户
     * @param username 用户名
     * @return 用户对象
     */
    public User getUserByUsername(String username) {
        return dao.findByUsername(username)
                .orElseThrow(() -> new IllegalArgumentException("用户不存在"));
    }

}
